草庐IT

C++ Templates 多态障碍

全部标签

c# - 使用 JSON 在 WCF 服务中保留多态类型

我有一个使用webHttpBinding端点的C#WCF服务,它将接收和返回JSON格式的数据。要发送/接收的数据需要使用多态类型,以便不同类型的数据可以在同一个“数据包”中交换。我有以下数据模型:[DataContract]publicclassDataPacket{[DataMember]publicListDataEvents{get;set;}}[DataContract][KnownType(typeof(IntEvent))][KnownType(typeof(BoolEvent))]publicclassDataEvent{[DataMember]publiculongI

c# - 如何遵守 Liskov 替换原则 (LSP) 并仍然受益于多态性?

LSP说“派生类型不能改rebase类型的行为”,换句话说“派生类型必须完全可以替换它们的基类型”。这意味着如果我们在基类中定义虚方法,我们就违反了这个原则。另外,如果我们使用new关键字在驱动方法中隐藏一个方法,那么我们又违反了这个原则。换句话说,如果我们使用多态性,我们就违反了LSP!在许多应用程序中,我在基类中使用了虚拟方法,现在我意识到它违反了LSP。另外,如果你使用模板方法模式,你就违反了我经常使用它的原则。那么,当您需要继承并且还希望从多态性中获益时,如何设计符合此原则的应用程序呢?我很困惑!请参阅此处的示例:http://www.oodesign.com/liskov-s

c# - 通过扩展方法实现多态性?

我有一个类库,其中包含一些基类和派生自它们的其他类。在这个类库中,我利用多态性来做我想做的事。现在在一个消费应用程序中,我想根据子类的运行时类型更改某些代码的行为。所以假设如下:publicclassBase{}publicclassChild1:Base{}publicclassChild2:Base{}现在在消费应用程序中我想做如下事情(注意以下所有类都在消费应用程序中,不能在类库中引用):publicinterfaceIMyInterface1{}publicinterfaceIMyInterface2{}publicstaticclassExtensions{publicsta

c# - 方法重载和多态性

classProgram{staticvoidMain(string[]args){ListmyList=newList{newA(),newB(),newC()};foreach(varainmyList){Render(a);}Console.ReadKey();}privatestaticvoidRender(Ao){Console.Write("A");}privatestaticvoidRender(Bb){Console.Write("B");}privatestaticvoidRender(Cc){Console.Write("C");}}classA{}classB:A

c# - 多态模型可绑定(bind)表达式树解析器

我正在尝试找出一种方法来构建我的数据,以便它是模型可绑定(bind)的。我的问题是我必须创建一个可以表示数据中的多个表达式的查询过滤器。例如:x=>(x.someProperty==true&&x.someOtherProperty==false)||x.UserId==2x=>(x.someProperty&&x.anotherProperty)||(x.userId==3&&x.userIsActive)我已经创建了这个代表所有表达式的结构,我的问题是我如何才能使它成为模型可绑定(bind)的属性publicenumFilterCondition{Equals,}publicenu

c# - WCF 中的多态性

我正在考虑构建一个可以存储/检索一系列不同类型的WCF服务。以下示例是否可行并且也被认为是可接受的设计:[ServiceContract]publicinterfaceIConnection{[OperationContract]IObjectRetrieveObject(GuidObjectID);[OperationContract]GuidStoreObject(IObjectNewObject);}[ServiceContract][ServiceKnownType(IOne)][ServiceKnownType(ITwo)]publicinterfaceIObject{[Da

c# - 多态和类型转换

我想了解C#中的多态性,因此通过尝试几种构造,我想到了以下情况:classShape{publicvirtualvoidDraw(){Console.WriteLine("Shape.Draw()");}}classCircle:Shape{publicoverridevoidDraw(){Console.WriteLine("Circle.Draw()");}}我明白,为了将Draw()消息发送到几个相关对象,以便它们可以根据自己的实现执行操作,我必须更改(在本例中)形状“指向”的实例:Shapeshape=newCircle();shape.Draw();//OK;Thisprin

c# - C# 中的多态性、重载和泛型

classPoly{publicstaticvoidWriteVal(inti){System.Console.Write("{0}\n",i);}publicstaticvoidWriteVal(strings){System.Console.Write("{0}\n",s);}}classGenWriter{publicstaticvoidWrite(Tx){Poly.WriteVal(x);}}为什么在C#中不接受无辜的(对于C++程序员)方法Write?您可以看到编译器尝试将参数类型T与具体重载相匹配before实例化:错误3Thebestoverloadedmethodmat

c# - 多态基础

我现在正在研究继承和多态性,我遇到了这样一个概念,即编译器将评估(使用反射?)什么类型的对象存储在基类型引用中,以便决定在什么方法上运行调用具有覆盖的方法。例如:classShape{publicvirtualvoidDraw(){Console.WriteLine("Drawingshape...");}}classCircle:Shape{publicoverridevoidDraw(){Console.WriteLine("Drawingcircle...");}}staticvoidMain(){ShapetheShape=newCircle();theShape.Draw()

c# - 你如何在 Ruby 中实现多态性?

在C#中,我可以这样做:classProgram{staticvoidMain(string[]args){Listanimals=newList();animals.Add(newDog());animals.Add(newCat());foreach(Animalainanimals){Console.WriteLine(a.MakeNoise());a.Sleep();}}}publicclassAnimal{publicvirtualstringMakeNoise(){returnString.Empty;}publicvoidSleep(){Console.Writeline